package cn.example.common.protocol;

import org.artifact.core.lang.DTO;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Supplier;
import cn.example.common.protocol.structs.*;

public class StructUtil {
    static Map<Integer, Supplier<? extends  DTO>> cahce = new HashMap<>();
    static Map<Class, Integer> codes = new HashMap<>();
    static {
        // 用户信息
        cahce.put(1517493748,() -> new UserDTO());
        // 玩家简单信息
        cahce.put(1102355472,() -> new PlayerInfoDTO());
        // 目标玩家信息
        cahce.put(-684126067,() -> new TargetPlayerDTO());
        // 玩家信息
        cahce.put(131897118,() -> new PlayerDTO());
        // 英雄
        cahce.put(-1819011227, () -> new HeroDTO());
        // 邮件
        cahce.put(-1799377784,() -> new MailDTO());
        // 道具
        cahce.put(1355489116,() -> new PropDTO());
        // 道具 -> 装备
        cahce.put(-325130863,() -> new EquipmentDTO());
        // 任务
        cahce.put(127386106,() -> new TaskDTO());
        // 聊天信息
        cahce.put(160702518,() -> new ChatMsgDTO());

        // 用户信息
        codes.put(cn.example.common.protocol.structs.UserDTO.class,1517493748);
        // 玩家简单信息
        codes.put(cn.example.common.protocol.structs.PlayerInfoDTO.class,1102355472);
        // 目标玩家信息
        codes.put(cn.example.common.protocol.structs.TargetPlayerDTO.class,-684126067);
        // 玩家信息
        codes.put(cn.example.common.protocol.structs.PlayerDTO.class,131897118);
        // 英雄
        codes.put(cn.example.common.protocol.structs.HeroDTO.class,-1819011227);
        // 邮件
        codes.put(cn.example.common.protocol.structs.MailDTO.class,-1799377784);
        // 道具
        codes.put(cn.example.common.protocol.structs.PropDTO.class,1355489116);
        // 道具 -> 装备
        codes.put(cn.example.common.protocol.structs.EquipmentDTO.class,-325130863);
        // 任务
        codes.put(cn.example.common.protocol.structs.TaskDTO.class,127386106);
        // 聊天信息
        codes.put(cn.example.common.protocol.structs.ChatMsgDTO.class,160702518);
    }

    public static <T extends DTO> T create(int code){
        return (T) cahce.get(code).get();
    }

    public static Integer structCode(Class structClass){
        return codes.get(structClass);
    }
}
